home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / site-packages / impacket / dcerpc / srvsvc.py < prev    next >
Text File  |  2006-05-23  |  8KB  |  273 lines

  1. # Copyright (c) 2003-2006 CORE Security Technologies
  2. #
  3. # This software is provided under under a slightly modified version
  4. # of the Apache Software License. See the accompanying LICENSE file
  5. # for more information.
  6. #
  7. # $Id: srvsvc.py,v 1.2 2006/05/23 21:19:26 gera Exp $
  8. #
  9. # Description:
  10. #   SRVSVC interface implementation.
  11. #
  12.  
  13. import array
  14. from struct import *
  15. import exceptions
  16.  
  17. from impacket import ImpactPacket
  18. import dcerpc
  19. import ndrutils
  20.  
  21. MSRPC_UUID_SRVSVC = '\xc8\x4f\x32\x4b\x70\x16\xd3\x01\x12\x78\x5a\x47\xbf\x6e\xe1\x88\x03\x00\x00\x00'
  22.  
  23. class SRVSVCNetShareGetInfoHeader(ImpactPacket.Header):
  24.     OP_NUM = 0x10
  25.     __SIZE = 32
  26.  
  27.     def __init__(self, aBuffer = None):
  28.         ImpactPacket.Header.__init__(self, SRVSVCNetShareGetInfoHeader.__SIZE)
  29.  
  30.         self._set_shalen(0)
  31.         self._set_serlen(0)
  32.  
  33.         self.set_server_referent_id(0x0011bf74)
  34.         self.set_server_max_count(0)
  35.         self.set_server_offset(0)
  36.         self.set_server_actual_count(0)
  37.         self.set_server('')
  38.         self.set_share_max_count(0)
  39.         self.set_share_offset(0)        
  40.         self.set_share_actual_count(0)
  41.         self.set_share('')
  42.         self.set_info_level(0)
  43.  
  44.         if aBuffer: self.load_header(aBuffer)
  45.  
  46.     def get_server_referent_id(self):
  47.         return self.get_long(0, '<')
  48.     
  49.     def set_server_referent_id(self, id):
  50.         self.set_long(0, id, '<')
  51.  
  52.     def get_server_max_count(self):
  53.         return self.get_long(4, '<')
  54.  
  55.     def set_server_max_count(self, count):
  56.         self.set_long(4, count, '<')
  57.  
  58.     def get_server_offset(self):
  59.         return self.get_long(8, '<')
  60.  
  61.     def set_server_offset(self, offset):
  62.         self.set_long(8, offset, '<')
  63.  
  64.     def get_server_actual_count(self):
  65.         return self.get_long(12, '<')
  66.  
  67.     def set_server_actual_count(self, count):
  68.         self.set_long(12, count, '<')
  69.  
  70.     def set_server(self, name):
  71.         pad = ''
  72.         if len(name) % 4:
  73.             pad = '\0' * (4 - len(name) % 4)
  74.         name = name + pad
  75.         ## 4 bytes congruency
  76.         self.get_bytes()[16:16 + len(name)] = array.array('B', name)
  77.         self._set_serlen(len(name))
  78.  
  79.     def _set_serlen(self, len):
  80.         self._serlen = len
  81.  
  82.     def _get_serlen(self):
  83.         return self._serlen
  84.  
  85.     def _set_shalen(self, len):
  86.         self._shalen = len
  87.  
  88.     def _get_shalen(self):
  89.         return self._shalen
  90.  
  91.     def get_share_max_count(self):
  92.         server_max_count = self._get_serlen()
  93.         return self.get_long(16 + server_max_count, '<')
  94.     
  95.     def set_share_max_count(self, count):
  96.         server_max_count = self._get_serlen()
  97.         self.set_long(16 + server_max_count, count, '<')
  98.  
  99.     def get_share_offset(self):
  100.         server_max_count = self._get_serlen()
  101.         return self.get_long(20 + server_max_count, '<')
  102.  
  103.     def set_share_offset(self, offset):
  104.         server_max_count = self._get_serlen()
  105.         self.set_long(20 + server_max_count, offset, '<')
  106.  
  107.     def get_share_actual_count(self):
  108.         server_max_count = self._get_serlen()
  109.         return self.get_long(24 + server_max_count, '<')
  110.  
  111.     def set_share_actual_count(self, count):
  112.         server_max_count = self._get_serlen()
  113.         self.set_long(24 + server_max_count, count, '<')
  114.  
  115.     def set_share(self, share):
  116.         server_max_count = self._get_serlen()
  117.         pad = ''
  118.         if len(share) % 4:
  119.            pad = '\0' * (4 - len(share) % 4) 
  120.         share = share + pad
  121.         self.get_bytes()[28 + server_max_count:28 + len(share)] = array.array('B', share)
  122.         self._set_shalen(len(share))
  123.  
  124.     def get_info_level(self):
  125.         server_max_count = self._get_serlen()
  126.         share_max_count = self._get_shalen()
  127.         return self.get_long(28 + server_max_count + share_max_count, '<')
  128.  
  129.     def set_info_level(self, level):
  130.         server_max_count = self._get_serlen()
  131.         share_max_count = self._get_shalen()
  132.         self.set_long(28 + server_max_count + share_max_count, level, '<')
  133.  
  134.     def get_header_size(self):
  135.         server_max_count = self._get_serlen()
  136.         share_max_count = self._get_shalen()
  137.         return SRVSVCNetShareGetInfoHeader.__SIZE + server_max_count + share_max_count
  138.     
  139.  
  140. class SRVSVCRespNetShareGetInfoHeader(ImpactPacket.Header):
  141.     __SIZE = 8
  142.  
  143.     def __init__(self, aBuffer = None):
  144.         ImpactPacket.Header.__init__(self, SRVSVCRespNetShareGetInfoHeader.__SIZE)
  145.         if aBuffer: self.load_header(aBuffer)
  146.  
  147.     def get_info_level(self):
  148.         return self.get_long(0, '<')
  149.  
  150.     def set_info_level(self, level):
  151.         self.set_long(0, level, '<')
  152.  
  153.     def set_share_info(self, info):
  154.         raise exceptions.Exception, "method not implemented"
  155.  
  156.     def get_share_info(self):
  157.         level = self.get_info_level()
  158.         if level == 2:
  159.             return ndrutils.NDRPointer(self.get_bytes()[4:-4].tostring(), ShareInfoLevel2Entry)
  160.         else:
  161.             raise exceptions.Exception, "Share Info level not supported"
  162.  
  163.     def get_return_code(self):
  164.         return self.get_long(len(self.get_bytes())-4, '<')
  165.  
  166.     def get_header_size(self):
  167.         return len(self.get_bytes())
  168.  
  169. class ShareInfoLevel2Entry:
  170.     def __init__(self, data = ''):
  171.         self.set_netname(0)
  172.         self.set_remark(0)
  173.         self.set_path(0)
  174.         self.set_passwd(0)
  175.         if data:
  176.             p_netname, self._type, p_remark, self._permissions, self._max_uses, \
  177.                        self._current_uses, p_path, p_passwd = unpack('<LLLLLLLL', data[: 8 * 4])
  178.             data = data[8 * 4:]
  179.             if p_netname:
  180.                 self.set_netname(ndrutils.NDRString(data))
  181.                 dlen = self.get_netname().get_max_len() * 2
  182.                 pad = 0
  183.                 if dlen % 4:
  184.                     pad = 4 - dlen % 4
  185.                 data = data[12 + dlen + pad:]
  186.             if p_remark:
  187.                 self.set_remark(ndrutils.NDRString(data))
  188.                 dlen = self.get_remark().get_max_len() * 2
  189.                 pad = 0
  190.                 if dlen % 4:
  191.                     pad = 4 - dlen % 4
  192.                 data = data[12 + dlen + pad:]                
  193.             if p_path:
  194.                 self.set_path(ndrutils.NDRString(data))
  195.                 dlen = self.get_path().get_max_len() * 2
  196.                 pad = 0
  197.                 if dlen % 4:
  198.                     pad = 4 - dlen % 4
  199.                 data = data[12 + dlen + pad:]                
  200.             if p_passwd:
  201.                 self.set_passwd(ndrutils.NDRString(data))
  202.                 dlen = self.get_passwd().get_max_len() * 2
  203.                 pad = 0
  204.                 if dlen % 4:
  205.                     pad = 4 - dlen % 4
  206.                 data = data[12 + dlen + pad:]
  207.  
  208.     def set_netname(self, netname):
  209.         self._netname = netname
  210.  
  211.     def get_netname(self):
  212.         return self._netname
  213.  
  214.     def set_remark(self, remark):
  215.         self._remark = remark
  216.  
  217.     def get_remark(self):
  218.         return self._remark
  219.  
  220.     def set_path(self, path):
  221.         self._path = path
  222.  
  223.     def get_path(self):
  224.         return self._path
  225.  
  226.     def set_passwd(self, passwd):
  227.         self._passwd = passwd
  228.  
  229.     def get_passwd(self):
  230.         return self._passwd
  231.  
  232.     def get_type(self):
  233.         return self._type
  234.  
  235.     def get_permissions(self):
  236.         return self._permissions
  237.  
  238.     def get_max_uses(self):
  239.         return self._max_uses
  240.  
  241.     def get_current_uses(self):
  242.         return self._current_uses
  243.     
  244.         
  245.  
  246. class DCERPCSrvSvc:
  247.     def __init__(self, dcerpc):
  248.         self._dcerpc = dcerpc
  249.  
  250.     def get_share_info(self, server, share, level):
  251.         server += '\0'
  252.         share += '\0'
  253.         server = server.encode('utf-16le')
  254.         share = share.encode('utf-16le')
  255.         info = SRVSVCNetShareGetInfoHeader()
  256.         server_len = len(server)
  257.         share_len = len(share)
  258.         info.set_server_max_count(server_len / 2)
  259.         info.set_server_actual_count(server_len / 2)
  260.         info.set_server(server)
  261.         info.set_share_max_count(share_len / 2)
  262.         info.set_share_actual_count(share_len / 2)
  263.         info.set_share(share)
  264.         info.set_info_level(2)
  265.         self._dcerpc.send(info)
  266.         data = self._dcerpc.recv()
  267.         retVal = SRVSVCRespNetShareGetInfoHeader(data)
  268.         return retVal
  269.  
  270.     
  271.  
  272.         
  273.